#include <iostream>
#include <stdio.h>
using namespace std;

class AA
{
public:
	AA() //无参构造函数 默认构造函数
	{	
		
	}
	AA(int _a) //有参构造函数
	{	
		a = _a;
	}
	//拷贝构造函数是c++独有的，是一种特殊的构造函数，用基于同一个类的一个对象构造和初始化另一个对象
 	AA(const AA &obj2)
 	{
 		a = obj2.a;
 	}
	~AA()
	{
		
	}
	void getA()
	{
		printf("a:%d \n", a);
	}

private:
	int a;
};

void init1()
{	
	//注意：初始化操作 和 等号操作 是两个不同的概念	
	AA a1; 
	AA a2(99);

    a1 = a2; //用a2来=号给a1 编译器给我们提供的浅copy，两者指向同一内存空间
	a1.getA();
	//拷贝构造函数的第一个应用场景：用对象1 初始化 对象2 
	AA a3 = a1; //调用拷贝构造函数创建对象a3，本身a3对象是不存在的，是用a1对象来构造和初始化的
	a3.getA();//若拷贝构造函数里没有进行赋值处理，那么得到一个垃圾值。此处用a1初始化a2，而a1中没有进行a赋值处理，所以得到垃圾值。
	
	AA a4 = a2;
	a4.getA();
	
}


void init2()
{
	AA b1(100); //变量定义
	//第二
	AA b2(b1); //定义变量并初始化 //括号法
	b2.getA();
} 

int main()
{
	printf("\n----init1------\n");
	init1();
	printf("\n----init2------\n");
	init2();
	return 0;
}